﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
using System.Windows.Forms;

using Noris.Tools.TraceVisualiser.Support;

namespace Noris.Tools.TraceVisualiser.Components
{
	#region CLASS DHeaderGridLayout : obsahuje paměť pro persistenci rozložení prvků GridPanelu
    /// <summary>
    /// DHeaderGridLayout : obsahuje paměť pro persistenci rozložení prvků GridPanelu
    /// </summary>
    internal class DHeaderGridLayout : IGraphLayout
    {
        #region KONSTRUKCE
        internal DHeaderGridLayout()
        {
			this.Clear();
        }
		public override string ToString()
		{
			return "Layout: Top=" + this.HeaderTop.ToString() +
				"; Height=" + this.HeaderHeight.ToString() +
				"; FilterHeight=" + this.HeaderFilterHeight.ToString() +
				"; ColumnCount=" + this.WidthList.Count.ToString();
		}
        #endregion
        #region PROPERTY
        /// <summary>
        /// Složka v registrech
        /// </summary>
        internal string RegFolder { get; private set; }
        /// <summary>
        /// Jméno v registrech
        /// </summary>
        internal string RegName { get; private set; }
        /// <summary>
        /// Příznak, že MainForm je maximalizovaný: "M"= max, "S"=standard, "" = nenačteno
        /// </summary>
        internal string MainFormWindowState { get; set; }
        /// <summary>
        /// Pozice MainForm (dovolí tak uložit pozici ve vícemonitorovém provozu)
        /// </summary>
        internal Rectangle MainFormBounds { get; set; }
		/// <summary>
		/// Pozice Header.Top  (u grafu A je vždy == 0, HeaderA nelze přesouvat, u grafu B představuje pozici Top)
		/// </summary>
		public int HeaderTop { get; set; }
		/// <summary>
		/// Rozměr Header.Height
		/// </summary>
		public int HeaderHeight { get; set; }
		/// <summary>
		/// Výška řádkového filtru v Header
		/// </summary>
		public int HeaderFilterHeight { get; set; }
		/// <summary>
		/// Seznam šířek jednotlivých sloupců (všech = tj. včetně systémového)
		/// </summary>
		public List<int> WidthList { get; set; }
		#endregion
        #region PERSISTENCE
        /// <summary>
        /// Vynuluje se
        /// </summary>
        internal void Clear()
        {
            this.RegFolder = null;
            this.RegName = null;
            this.WidthList = new List<int>();
			this.HeaderTop = 0;
			this.HeaderHeight = 40;
			this.HeaderFilterHeight = 18;
            this.MainFormWindowState = "";
            this.MainFormBounds = Rectangle.Empty;
        }
        /// <summary>
        /// Načte layout z registru
        /// </summary>
        /// <param name="folder"></param>
        /// <param name="name"></param>
        internal void Load(string folder, string name)
        {
            if (String.IsNullOrEmpty(folder) || String.IsNullOrEmpty(name))
				Msg.Error("Panellayout.Load(): missing value for Folder and/or Name.");

            this.RegFolder = folder;
            this.RegName = name;

            this.MainFormWindowState = WinReg.ReadString(folder, name + "_WS", "");
            this.MainFormBounds = ComponentLibrary.RectangleDeserialize(WinReg.ReadString(folder, name + "_WB", null));

            int dc = WinReg.ReadInt32(folder, name + "_CC", 3);                                 // Počet uložených sloupců
            if (dc < 0) dc = 0;

            this.WidthList = new List<int>();
            for (int c = 0; c < dc; c++)
                this.WidthList.Add(WinReg.ReadInt32(folder, name + "_C" + c.ToString(), 0));

			this.HeaderTop = WinReg.ReadInt32(folder, name + "_HT", -1);
			this.HeaderHeight = WinReg.ReadInt32(folder, name + "_HH", -1);
			this.HeaderFilterHeight = WinReg.ReadInt32(folder, name + "_HF", -1);
        }
        /// <summary>
        /// Uloží layout do registru, do folder a name uvedených v parametrech metody Load()
        /// </summary>
        internal void Save()
        {
            string folder = this.RegFolder;
            string name = this.RegName;

            if (String.IsNullOrEmpty(folder) || String.IsNullOrEmpty(name))
				Msg.Error("Panellayout.Save(): missing value for Folder and/or Name.");

            WinReg.WriteString(folder, name + "_WS", this.MainFormWindowState);
            WinReg.WriteString(folder, name + "_WB", ComponentLibrary.RectangleSerialize(this.MainFormBounds));

            WinReg.WriteInt32(folder, name + "_CC", this.WidthList.Count);                 // V položce "Name_CC" je počet sloupců
            for (int c = 0; c < this.WidthList.Count; c++)
                WinReg.WriteInt32(folder, name + "_C" + c.ToString(), this.WidthList[c]);  // V položkách "Name_C×" (kde × je index sloupce) jsou šířky sloupců

			WinReg.WriteInt32(folder, name + "_HT", this.HeaderTop);
			WinReg.WriteInt32(folder, name + "_HH", this.HeaderHeight);
			WinReg.WriteInt32(folder, name + "_HF", this.HeaderFilterHeight);
        }
        #endregion
		#region VERIFIKACE PO NAČTENÍ
		/// <summary>
		/// Ověří, zda layout obsahuje potřebný počet šířek sloupců, případně chybějící doplní
		/// </summary>
		/// <param name="widths"></param>
		internal void VerifyWidths(params int[] widths)
		{
			if (this.WidthList == null) this.WidthList = new List<int>();
			for (int i = 0; i < widths.Length; i++)
			{
				if (this.WidthList.Count < (i + 1))
					this.WidthList.Add(widths[i]);
				else if (this.WidthList[i] <= 5)
					this.WidthList[i] = widths[i];
			}
		}
		/// <summary>
		///  Ověří, zda layout obsahuje potřebný pro daný index stránky graf, a ověří jeho hodnoty.
		/// </summary>
		/// <param name="top"></param>
		/// <param name="height"></param>
		/// <param name="heigthFilter"></param>
		internal void VerifyGraph(int minTop, int top, int height, int heigthFilter)
		{
			if (this.HeaderTop < minTop) this.HeaderTop = top;
			if (this.HeaderHeight < 10) this.HeaderHeight = height;
			if (this.HeaderFilterHeight < 10) this.HeaderFilterHeight = heigthFilter;
		}
		#endregion
		#region ACCEPT / STORE LAYOUT FROM / TO FORM
        /// <summary>
        /// Nastaví pozici main okna podle this layoutu
        /// </summary>
        /// <param name="form"></param>
        internal void LayoutSetIntoForm(Form form)
        {
            if (form != null)
            {
                string ws = (String.IsNullOrEmpty(this.MainFormWindowState) ? "" : this.MainFormWindowState.ToUpper().Trim());
                if (ws == "S" && !this.MainFormBounds.IsEmpty)
                {   // Stav je "Standardní" a rozměry jsou známy:
                    form.WindowState = FormWindowState.Normal;
                    form.Bounds = this.MainFormBounds;
                }
                else if (ws == "M" && !this.MainFormBounds.IsEmpty)
                {   // Stav je Max, a známe Bounds = to nás může odnést na secondary monitor !
                    form.WindowState = FormWindowState.Maximized;
                    form.Bounds = this.MainFormBounds;
                }
                else
                {   // Jinak: maximized na primárním monitoru:
                    form.WindowState = FormWindowState.Maximized;
                    form.Size = SystemInformation.PrimaryMonitorMaximizedWindowSize;   // Dojde k dopočtení rozměrů grafu i časové osy
                }
            }
        }
		/// <summary>
		/// Do Layoutu uloží vlastnosti Formu
		/// </summary>
		internal void LayoutGetFromForm(Form form)
		{
			if (form != null)
			{
				switch (form.WindowState)
				{
					case FormWindowState.Maximized:
						this.MainFormWindowState = "M";
						this.MainFormBounds = form.Bounds;
						break;
					case FormWindowState.Normal:
						this.MainFormWindowState = "S";
						this.MainFormBounds = form.Bounds;
						break;
					// Pokud je okno minimalizované (když se ukončuje pravou myší na taskbaru), pak nebudu ukládat nic, nechám to podle posledního stavu.
				}
			}
		}
		#endregion
    }
    #endregion
}
